package com.lixw.aiassistant.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.lixw.aiassistant.model.memory.RecognizedIntent;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.Message;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class IntentRecognitionService {

    @Resource
    private ChatClient chatClient;

    @Resource
    private MemoryService memoryService;

    public RecognizedIntent recognizeIntent(String userInput, String sessionId) {
        //获取用户的历史记录
        List<Message> conversationContext = memoryService.getConversationContext(sessionId);
        //格式化历史记录
        String formatChatHistory = memoryService.formatChatHistory(conversationContext, userInput);
        String systemPrompt = """
                你是一个意图识别助手。请严格分析用户输入并识别意图。
                
                ## 意图类别说明
                - 'customer_chain': 用户咨询问题、产品信息、服务支持等客服相关问题
                - 'business_chain': 用户想要购买商品、下订单、查询或取消订单等业务操作
                
                ## 对话历史上下文
                %s
                
                ## 当前用户输入
                %s
                
                ## 输出要求
                请严格仅返回JSON格式数据，不要包含任何其他文字、解释或标记。
                
                ## JSON格式
                {
                    "intent": "customer_chain或business_chain",
                    "formatHistory": "对话历史上下文内容"
                }
                
                ## 识别规则
                1. 如果用户询问产品信息、服务政策、使用方法等 → customer_chain
                2. 如果用户表达购买意愿、查询订单、取消订单等 → business_chain
                3. 如果无法确定，默认使用 customer_chain
                
                现在请分析并返回JSON：
                """.formatted(formatChatHistory, userInput);



        String response = chatClient.prompt()
                .system(systemPrompt)
                .user(userInput)
                .call()
                .content();
        // 预处理响应，移除可能的标记和多余内容
        String cleanedResponse = cleanJsonResponse(response);
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.readValue(cleanedResponse, RecognizedIntent.class);
        } catch (Exception e) {
            return new RecognizedIntent("customer_chain", formatChatHistory);
        }
    }

    // 清理JSON响应的辅助方法
    private String cleanJsonResponse(String response) {
        if (response == null) return "{}";

        // 移除可能的代码块标记
        String cleaned = response.replaceAll("```json", "").replaceAll("```", "").trim();

        // 查找第一个{和最后一个}
        int start = cleaned.indexOf('{');
        int end = cleaned.lastIndexOf('}');

        if (start >= 0 && end > start) {
            return cleaned.substring(start, end + 1);
        }

        return cleaned;
    }

}